package cn.wubo.multi.thread.demo01;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.IntStream;

/**
 * 线程池
 * 1、背景：经常创建和销毁，使用量特别大的资源，比如并发情况下的线程，对性能影响很大。
 * 2、思路：提前创建好多个线程，放入线程池中，使用时直接获取，使用完放回池中，可以避免频繁创建销毁，实现重复利用。
 * 3、好处：提高响应速度(减少了创建新线程的时间)、降低资源消耗、便于线程管理
 */
public class Demo0105 {

    public static void main(String[] args) {
        //ExecutorService 接口
        ExecutorService executorService = Executors.newFixedThreadPool(5);//1 指定线程池的线程数量
        //ThreadPoolExecutor 类 其中实现了ExecutorService 接口
        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executorService;//可以实现线程池的设定
        //ScheduledThreadPoolExecutor 类 其中实现了ExecutorService 接口 主要用在延迟之后运行任务或者定期执行任务
        //ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = Executors.newScheduledThreadPool(5)

        IntStream.range(0, 10).forEach(i -> threadPoolExecutor.execute(() -> {
            //等待一会
            try {
                Thread.sleep((int) (Math.random() * 100));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName());
        }));//2 执行 适合使用Runnable

        threadPoolExecutor.shutdown();//3 关闭连接池
        //threadPoolExecutor.submit();//适合使用callable
    }
}
